package AlgoritmosGeneticos.model.impl.cruces;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import utils.CustomRandom;
import AlgoritmosGeneticos.model.Individuo;
import AlgoritmosGeneticos.model.OperadorCruce;
import AlgoritmosGeneticos.model.impl.IndividuoImpl;

public class CruceSegmentado implements OperadorCruce{

	private double pSeg = 0.2;
	
	public CruceSegmentado(){
		super();
		System.out.println("Cruce Segmentado");
	}

	@Override
	public List<Individuo> cruzar(Individuo i1, Individuo i2) {
		List<Double> rands = new ArrayList<Double>();
		LinkedList<Individuo> resp = new LinkedList<Individuo>();
		double random;
		/*Genero randoms*/
		for(int i=0; i<i1.length(); i++){
			do{
				random = CustomRandom.getInstance().getDoubleRandom();
			}while(rands.contains(random));
			rands.add(random);
		}
		
		/*Para imprimir*/
		DecimalFormat df = new DecimalFormat("0.00");  
		for(Double rand : rands){
//			System.out.print(df.format(rand) + " | ");
		}
//		System.out.println();	
		
		char[] ind1 = i1.getNumenoBinario().toCharArray();
		char[] ind2 = i2.getNumenoBinario().toCharArray();
		char[] hijo1 = new char[i1.length()];
		char[] hijo2 = new char[i2.length()];
		
		for(int i=0; i<rands.size(); i++){
			/*Si la prob es menor swapeo*/
			if(rands.get(i) < pSeg){
				hijo1[i] = ind2[i];
				hijo2[i] = ind1[i];
			}
			else{
				hijo1[i] = ind1[i];
				hijo2[i] = ind2[i];
			}
		}
		
		String hijo1Resp = new String(hijo1); 
		String hijo2Resp = new String(hijo2);
			
		resp.add(new IndividuoImpl(hijo1Resp, i1.getpMut()));
		resp.add(new IndividuoImpl(hijo2Resp, i1.getpMut()));
		
		return resp;
	}
	
}
